/* 
使用说明
1.Handler类基于pthread进行，每10ms循环一次进行判断那些消息队列超时可以进行处理。
不适用于要求实时性能高的应用场合。
2.下面方法涉及到的timeout单位为毫秒。
3.此类必须和CmsgLink配套使用，对于应用层来说无需使用CmsgLink类。
4.使用Handler前，必须先调用startHandlerTask方法一次，进行初始化。
5.方法中涉及到的id是用于可能需要撤回的消息id，以便识别。

example：
#include <cstdlib>
#include <stdio.h>
#include <unistd.h>
#include "Handler.h"

using namespace std;

void test(void *arg, char *pData, int len)
{
    printf("callback len = %d, pData = %s, arg = %s\r\n", len, pData, arg);
}

int main(int argc, char** argv) 
{
    char *test1 = "test1";
    char *test2 = "test2";
    char *test3 = "test3";
    char *test4 = "test4";
    char *test5 = "test5";
    char *test6 = "test6";
    
    Handler *handler = new Handler();
    
    handler->startHandlerTask();
    
    handler->sendMsgDelay(0, 1000, test1, 6, NULL, test);
    handler->sendMsgDelay(0, 3000, test2, 6, NULL, test);
    handler->sendMsgDelay(0, 5000, test3, 6, NULL, test);
    handler->sendMsgDelay(0, 7000, test4, 6, NULL, test);
    handler->sendMsgDelay(0, 10000, test5, 6, NULL, test);
    handler->sendMsgDelay(0, 15000, test6, 6, test1, test);
    
    sleep(50);
    
    return 0;
}
*/

#ifndef HANDLER_H
#define	HANDLER_H

#include "CmsgLink.h"

class Handler {
public:
    
    Handler();
    Handler(const Handler& orig);
    virtual ~Handler();
    
    static Handler* getInstance();
    
    void startHandlerTask();
    int sendMsgDelay(int id, int timeout, void *pData, int pDatalen);
    int sendMsgDelay(int id, int timeout, void *pData, int pDatalen, void *arg, Callback callback);
    int removeMsg(int id);
    
    void init(void);

    int getMsgNum(void);
    int getMsgById(int id, void *pData, int maxLen);

    bool isNodeIdExist(int id);
    
private:
    
    char isHandlerLoopStart;
    
    pthread_t handlerTask;
    CmsgLink *pCmsgLink; //需要延迟处理的消息链表
    
    pthread_mutex_t mMutex;
    pthread_cond_t mConditional;
    
    static Handler* _pIo;
    
    void handlerLoop(void *pArg);
    friend void *_handlerLoop(void *pArg);
    
    void dprintf(char *pData, int len);
};

#endif	/* HANDLER_H */

